#include "hal_key_gpio.h"
#include "hal_pwm_gpio.h"

#define KEY_LED_UP_GPIO_Pin            GPIO_PIN_13
#define KEY_LED_UP_GPIO_Port           GPIOB

#define KEY_LED_DOWN_GPIO_Pin          GPIO_PIN_14
#define KEY_LED_DOWN_GPIO_Port         GPIOB

#define KEY_LED_ONOFF_GPIO_Pin         GPIO_PIN_15
#define KEY_LED_ONOFF_GPIO_Port        GPIOB

key_t led_ctrl_key[3] = {0};

void hal_key_gpio_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitStruct.Pin = KEY_LED_UP_GPIO_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(KEY_LED_UP_GPIO_Port, &GPIO_InitStruct);
    
    GPIO_InitStruct.Pin = KEY_LED_DOWN_GPIO_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(KEY_LED_DOWN_GPIO_Port, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = KEY_LED_ONOFF_GPIO_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(KEY_LED_ONOFF_GPIO_Port, &GPIO_InitStruct);
    
    /* Enable and set line 13 Interrupt to the lowest priority */
    HAL_NVIC_SetPriority(EXTI13_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(EXTI13_IRQn);
    
    HAL_NVIC_SetPriority(EXTI14_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(EXTI14_IRQn);
    
    HAL_NVIC_SetPriority(EXTI15_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(EXTI15_IRQn);
}

uint32_t hal_key_gpio_read(void)
{
    uint32_t key_status = 0;
    
    //printf("%d\n", HAL_GPIO_ReadPin(KEY_LED_ONOFF_GPIO_Port, KEY_LED_ONOFF_GPIO_Pin));
    //printf("%d\n", HAL_GPIO_ReadPin(KEY_LED_DOWN_GPIO_Port, KEY_LED_DOWN_GPIO_Pin));
    //printf("%d\n", HAL_GPIO_ReadPin(KEY_LED_UP_GPIO_Port, KEY_LED_UP_GPIO_Pin));
    
    if (HAL_GPIO_ReadPin(KEY_LED_ONOFF_GPIO_Port, KEY_LED_ONOFF_GPIO_Pin) == GPIO_PIN_RESET)
        key_status |= (1 << KEY_LED_ONOFF);
    
    if (HAL_GPIO_ReadPin(KEY_LED_DOWN_GPIO_Port, KEY_LED_DOWN_GPIO_Pin) == GPIO_PIN_RESET)
        key_status |= (1 << KEY_LED_DOWN);
   
    if (HAL_GPIO_ReadPin(KEY_LED_UP_GPIO_Port, KEY_LED_UP_GPIO_Pin) == GPIO_PIN_RESET)
        key_status |= (1 << KEY_LED_UP);
    
    return key_status;
}

void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{    
    if (GPIO_Pin == KEY_LED_UP_GPIO_Pin)
    {
        led_ctrl_key[KEY_LED_UP].flag = 1;
        led_ctrl_key[KEY_LED_UP].timestamp = HAL_GetTick();
    }
    else if (GPIO_Pin == KEY_LED_DOWN_GPIO_Pin)
    {
        led_ctrl_key[KEY_LED_DOWN].flag = 1;
        led_ctrl_key[KEY_LED_DOWN].timestamp = HAL_GetTick();
    }
    else if (GPIO_Pin == KEY_LED_ONOFF_GPIO_Pin)
    {
        led_ctrl_key[KEY_LED_ONOFF].flag = 1;
        led_ctrl_key[KEY_LED_ONOFF].timestamp = HAL_GetTick();
    }
}